package com.dimples.dd.web.feign.config;

import cn.hutool.core.codec.Base64Encoder;
import cn.hutool.core.map.MapUtil;
import com.dimples.dd.common.constant.DDConstant;
import com.dimples.dd.common.context.RequestContextHolder;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.web.context.request.RequestContextListener;

import java.util.Map;

/**
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2024/6/6
 */
public class DDOAuth2FeignConfigure {

    /**
     * 覆写拦截器，在feign发送请求前取出原来的header并转发
     *
     * @return 拦截器
     */
    @Bean
    public RequestInterceptor requestInterceptor() {
        return (template) -> {
            Map<String, String> localMap = RequestContextHolder.getLocalMap();
            if (MapUtil.isNotEmpty(localMap)) {
                localMap.forEach((k, v) -> {
                    // 忽略content-length。因为在复制请求头到新请求时，原始的content-length可能不再准确。
                    if (!"content-length".equalsIgnoreCase(k)) {
                        // 将请求头保存到模板中，除了 Content-Length
                        template.header(k, v);
                    }
                });
            } else {
                //解决后台任务feign接口，无GatewayToken的问题
                byte[] token = Base64Encoder.encode(DDConstant.GATEWAY_TOKEN_VALUE.getBytes()).getBytes();
                String[] headerValues = {new String(token)};
                template.header(DDConstant.GATEWAY_TOKEN_HEADER, headerValues);
            }
        };
    }

    /**
     * RequestContextListener监听器
     *
     * @return RequestContextListener
     */
    @Bean
    public RequestContextListener requestContextListenerBean() {
        return new RequestContextListener();
    }
}
